package main

import (
	"fmt"
	"reflect"
)

type User struct{}

func main() {
	objects := []interface{}{
		42,          // 基本类型
		&User{},     // 指针
		[]int{1, 2}, // 切片
		User{},      // 结构体
		map[string]int{},
	}

	for _, o := range objects {
		t := reflect.TypeOf(o)
		fmt.Printf("Type=%-15v  Kind=%v\n", t, t.Kind())
	}
}
// Kind 是“户口本大类”——Go 语言规范里固定死的 26 种元类别。
// Type 是“身份证”——你代码里写的每一个具体类型（含自定义名、指针、切片等）都对应一个 reflect.Type，但一定落在某一个大类（Kind）里。

// 26 种 Kind 一览表（Go 1.20 及以前）
// | 序号 | Kind 常量         | 说明                            |
// | -- | --------------- | ----------------------------- |
// | 1  | `Invalid`       | 零值，反射占位用                      |
// | 2  | `Bool`          | `bool`                        |
// | 3  | `Int`           | `int`                         |
// | 4  | `Int8`          | `int8`                        |
// | 5  | `Int16`         | `int16`                       |
// | 6  | `Int32`         | `int32`                       |
// | 7  | `Int64`         | `int64`                       |
// | 8  | `Uint`          | `uint`                        |
// | 9  | `Uint8`         | `uint8`（也就是 `byte`）           |
// | 10 | `Uint16`        | `uint16`                      |
// | 11 | `Uint32`        | `uint32`                      |
// | 12 | `Uint64`        | `uint64`                      |
// | 13 | `Uintptr`       | `uintptr`                     |
// | 14 | `Float32`       | `float32`                     |
// | 15 | `Float64`       | `float64`                     |
// | 16 | `Complex64`     | `complex64`                   |
// | 17 | `Complex128`    | `complex128`                  |
// | 18 | `Array`         | 固定长度数组 `[N]T`                 |
// | 19 | `Chan`          | `chan T`                      |
// | 20 | `Func`          | `func(...)`                   |
// | 21 | `Interface`     | `interface{}`                 |
// | 22 | `Map`           | `map[K]V`                     |
// | 23 | `Ptr`           | 指针 `*T`                       |
// | 24 | `Slice`         | 切片 `[]T`                      |
// | 25 | `String`        | `string`                      |
// | 26 | `Struct`        | `struct{...}`                 |
// | 27 | `UnsafePointer` | `unsafe.Pointer`（Go 1.20 起新增） |

// Type 与 Kind 的对应示例
// | 对照表               | reflect.Type       | reflect.Kind    |
// | ------------------- | ------------------ | --------------- |
// | `type MyInt int`    | `main.MyInt`       | `reflect.Int`   |
// | `type Users []User` | `main.Users`       | `reflect.Slice` |
// | `*bytes.Buffer`     | `*bytes.Buffer`    | `reflect.Ptr`   |
// | `map[string]int`    | `map[string]int`   | `reflect.Map`   |
// | `func(int) string`  | `func(int) string` | `reflect.Func`  |
